// 基础语法

// 标识符命名规则：1.字母、数字、下划线、$ 2.不能以数字开头 3.区分大小写  驼峰命名
// let 变量
let a = 666  // 动态类型
console.log(a)

// const 常量
const b = "abc"
// b = 12.5  // 常量不能修改否则报错
console.log(b)


// 数据类型：number、string、boolean、null(唯一的值null，空值，不是空指针)、undefined(未定义的，唯一值undefined)，object
console.log(typeof a)
console.log(typeof b)
console.log(typeof true)
console.log(typeof c)
console.log(typeof null)
console.log(typeof undefined)
console.log(typeof Math)

// 类型转换 xx-> string, number, boolean
// 显式转换
// xx-> string
console.log(String(null)); // "null"
console.log((12.5).toString); // "12.5"

// xx-> number
console.log(Number(undefined)); // NaN
console.log(Number(null)); // 0
console.log(Number(" 12.5 ")) // 12.5
console.log(Number(" 12.5px ")) //NaN
console.log(Number("")) // 0
console.log(parseInt("12px")) // 12
console.log(parseFloat("12.56px").toFixed(1)) // 12.6 

// xx-> boolean
console.log(Boolean(null))  // false
console.log(Boolean(""))    // false

// 隐式转换
// 算术运算符：+ - * / % **
// 逻辑运算符：&& || !
// 比较运算符：< > <= >= == != === !==

console.log("px" + 12); // "px12"
console.log(4 + 5 + "px"); // "9px"

// xx-> number
console.log(4 - "px"); // NaN
console.log(4 - "2");  // 2
console.log("" == false); // true
console.log("" === false); // false

// xx -> boolean
// 特殊运算符
console.log(0 || "abc") // "abc" 或运算寻找第一个真值
console.log(0 || null || "abc"); // "abc" 或运算寻找第一个真值
console.log(0 && null && "abc"); // 0 或运算寻找第一个假值

console.log(null ?? "abc"); // "abc"













